perm filename SCAN.MAC[NET,KMC]  blob 
sn#124788 filedate 1975-07-05 generic text, type C, neo UTF8
 
COMMENT ā   VALID 00004 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	TITLE SCAN -- GENERAL PURPOSE ADAPTER FOR LISP SCANNER
C00004 00003	SCANLAST: XWD OLDSCN,IGSTRT
C00006 00004
C00008 ENDMK
Cā;
TITLE SCAN -- GENERAL PURPOSE ADAPTER FOR LISP SCANNER
A=1
B=2
C=3
R=13
T=6
P=14
S=11
CR=15
LF=12
TAB=11
IGCRLF=32
INUM0=577777
OPDEF CALLF [36B8]
EXTERNAL CHRTAB,IGSTRT,RATOM,OLDCH,FIX1A,NOINFG,SCNVAL,READ,NUMVAL,%SCNSF
INTERNAL SCAN,UNTYI,SCANSET,SCANRESET,SCANINIT,LETTER,IGNORE,SREAD
INTERNAL SCANFNSET,DELLIM,MODCHR,SCANPUSH,SCANPOP
SCANFNSET:
	MOVEM	1,SCNFN#
	POPJ	P,
SCAN:	SETOM NOINFG
	PUSHJ P,RATOM
	SKIPA
	PUSHJ P,FIX1A	;NOT AN ATOM.  MAKE INTO NUMBER.
	MOVEM A,SCNVAL(S)
	MOVEI A,INUM0(R)
	SKIPN C,SCNFN		;MONITORING INPUT?
	POPJ P,
	MOVE	B,SCNVAL(S)
	CALLF	2,(C)		;(RETURN SCANFN TYPE VAL)
CPOPJ:	POPJ P,
UNTYI:	SUBI A,INUM0
	MOVEM A,OLDCH
	JRST FIX1A
OLDSCN:	IGCRLF	;IGSTRT
	LF	;IGEND
	POINT 4,CHRTAB(A),5	;RATFLD
	POINT 2,CHRTAB(A),10	;STRFLD
	POINT 3,CHRTAB(A),13	;IDFLD
IGST2:	0	;IGSTRT
IGEND2:	0	;IGEND
RATF2:	POINT 4,CHRTAB(A),29	;RATFLD
STRF2:	POINT 2,CHRTAB(A),31	;STRFLD
IDF2:	POINT 3,CHRTAB(A),34	;IDFLD
SCANLAST: XWD OLDSCN,IGSTRT
SCANPOP: SKIPA A,SCANLAST
SCANPUSH:MOVE A,@SCANRESET
	 JRST SCNSET
SCANSET:	SKIPA A,[XWD IGST2,IGSTRT]
SCANRESET:	MOVE A,[XWD OLDSCN,IGSTRT]
	MOVEM A,SCANLAST
SCNSET:	BLT A,IGSTRT+4
FALSE:	MOVEI A,0
	POPJ P,
SCANINIT:	SUBI A,INUM0
	SUBI B,INUM0
	SUBI C,INUM0
	SUBI C+1,INUM0
	SUBI C+2,INUM0
	MOVEM A,IGST2	;IGSTRT
	MOVEM B,IGEND2	;IGEND
	PUSH P,C	;STRBEG
	PUSH P,C+1	;STREND
	PUSH P,C+2	;SLASHIFY
	MOVEI B,2
	MOVEI C,3
	MOVEI A,176
	DPB B,RATF2
	DPB C,STRF2
	DPB B,IDF2
	SOJG A,.-3
	MOVE A,[XWD "A"-"Z"-1,"A"]
	MOVEI B,5
	MOVEI C,4
	DPB B,RATF2
	DPB C,IDF2
	AOBJN A,.-2
	MOVE A,[XWD "a"-"z"-1,"a"]
	DPB B,RATF2
	DPB C,IDF2
	AOBJN A,.-2
	MOVE A,[XWD "0"-"9"-1,"0"]
	MOVEI B,8
	DPB B,RATF2
	DPB C,IDF2
	AOBJN A,.-2
	POP P,A	;SLASHIFY
	MOVEI B,3
	DPB B,IDF2
	DPB C,RATF2
	POP P,A	;STREND
	MOVEI B,2
	DPB B,STRF2
	POP P,A	;STRBEG
	MOVEI B,9
	DPB B,RATF2
	MOVE A,IGST2
	MOVEI B,0
	DPB B,RATF2
	DPB B,STRF2
	DPB B,IDF2
	MOVEI B,1
	MOVEI A,0	;NULL
	DPB B,RATF2
	DPB B,IDF2
	DPB B,STRF2
	MOVEI A,"."
	MOVEI B,7
	DPB B,RATF2
	MOVEI A,SCANRESET	;Tell LISP that we are around.
	MOVEM A,%SCNSF(S)
	JRST FALSE
LETTER:	SUBI A,INUM0
	MOVEI B,5
	MOVEI C,4
	DPB C,IDF2
LET2:	DPB B,RATF2
	JRST FALSE
IGNORE:	SUBI A,INUM0
	MOVEI B,3
	JRST LET2
DELLIM: SUBI A,INUM0	;WHATEVER IT WAS IS NOW A DELIMITER
	MOVEI B,2
	JRST LET2
MODCHR:	SUBI A,INUM0	;CHAR TO BE MODIFIED
	PUSH P,A
	MOVE A,CHRTAB(A);NEW VALUE IS OLD, IF 2D ARG NIL
	JUMPE B,JSTRET
	MOVE A,B	;NEW TABLE ENTRY
	PUSHJ P,NUMVAL	;GET REAL VALUE OF NEW VALUE
JSTRET:	POP P,B		;CHAR BACK
	EXCH A,CHRTAB(B);STORE NEW VALUE (OR OLD), RETURN OLD
	JRST FIX1A	;RETURN LISPIFIED OLD VALUE
	
	
SREAD:	MOVEI A,","	;IGNORE COMMAS FOR AWHILE.
	PUSHJ P,IGNORE+1
	PUSHJ P,READ	;READ AN S-EXPRESSION.
	PUSH P,A	;SAVE IT TEMPORARILY.
	MOVEI A,","
	MOVEI B,2
	DPB B,RATF2	;RESTORE COMMA AS A DELIMITER.
	POP P,A
	POPJ P,
END